'use strict'

const permutate = (aString) => {
  if (typeof aString !== 'string' || !aString) {
    throw new Error('The arg must be a valid, non empty string')
  }
  const characters = aString.split('')
  let permutations = [[characters.shift()]]
  while (characters.length) {
    const currentCharacter = characters.shift()
    permutations = calculateCurrentCharacterPermutation(permutations, currentCharacter)
  }
  return permutations
    .map(character => character.join(''))
    .filter((item, index, self) => (self.indexOf(item) === index))
    .sort()
}

const calculateCurrentCharacterPermutation = (allPermutations, currentCharacter) => {
  const currentPermutations = []
  allPermutations.forEach(permutation => {
    let index = 0
    while (index <= permutation.length) {
      const tmp = [...permutation]
      tmp.splice(index, 0, currentCharacter)
      currentPermutations.push(tmp)
      index++
    }
  })
  return currentPermutations
}

export { permutate }
